home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
rjs.lha
/
RJS
/
Transport
/
src
/
Transport.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-14
|
9KB
|
289 lines
#ifndef RJS_TRANSPORT_CLASS_H
#define RJS_TRANSPORT_CLASS_H
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdnet/dn.h>
#include <netdnet/dnetdb.h>
#include <iostream.h>
typedef struct sockaddr *SOCKADDR_PTR;
typedef const struct sockaddr *CONST_SOCKADDR_PTR;
#include <RJS/Status.h>
class RJS_NetworkAddress : public virtual RJS_Status {
public:
static const RJS_Status
NoHostGiven,
UnknownHost,
HostFound;
};
class RJS_InetAddress : public RJS_NetworkAddress {
friend ostream &operator<<(ostream &os, const RJS_InetAddress &ia);
public:
static char *Any; // any address
static char *Broadcast; // broadcast address
static const RJS_Status UnKnownService;
RJS_InetAddress();
RJS_InetAddress(const char *hostname,int port);
RJS_InetAddress(int port);
RJS_InetAddress(const char *hostname,const char *service,const char *proto);
RJS_InetAddress(const char *service,const char *proto);
lookup(const char *hostname,int port);
lookup(int port) {
return lookup(Any,port);
}
lookup(const char *hostname,const char *service,const char *proto);
lookup(const char *service,const char *proto) {
return lookup(Any,service,proto);
}
const char *hostname() const;
const char *numeric_hostname() const;
int size() const { return sizeof(address); }
int port() const;
int isany() const { return any_flag; }
int isbroadcast() const { return broadcast_flag; }
operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; }
operator CONST_SOCKADDR_PTR() const { return (SOCKADDR_PTR) &address; }
struct sockaddr_in address;
int addrlen;
int any_flag;
int broadcast_flag;
};
class RJS_UnixAddress : public RJS_NetworkAddress {
friend ostream &operator<<(ostream &os, const RJS_UnixAddress &ia);
public:
static const RJS_Status NoPathGiven;
static char *Temp; // any address
RJS_UnixAddress();
RJS_UnixAddress(const char *pathname);
void set(const char *pathname);
const char *pathname() const;
int size() const { return sizeof(address); }
operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; }
operator CONST_SOCKADDR_PTR() const { return (SOCKADDR_PTR) &address; }
struct sockaddr_un address;
int addrlen;
};
class RJS_DECnetAddress : public RJS_NetworkAddress {
friend ostream &operator<<(ostream &os, const RJS_DECnetAddress &ia);
public:
static const RJS_Status UnKnownObject;
RJS_DECnetAddress();
RJS_DECnetAddress(int object);
RJS_DECnetAddress(const char *object);
RJS_DECnetAddress(const char *node, int obj);
RJS_DECnetAddress(const char *node, const char *obj);
lookup(const char *hostname,int object);
lookup(const char *hostname,const char *object);
lookup(int object);
lookup(const char *object);
const char *hostname() const;
const char *objname() const;
int objnum() const { return address.sdn_objnum; }
int size() const { return sizeof(address); }
operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; }
operator CONST_SOCKADDR_PTR() const { return (SOCKADDR_PTR) &address; }
void dump();
struct sockaddr_dn address;
int addrlen;
};
class RJS_Transport : public virtual RJS_Status {
public:
RJS_Transport();
virtual void abstract_class()=0;
virtual int close();
virtual int read(char *buffer, int len);
virtual int write(const char *buffer,int len);
virtual int readv(const struct iovec *, int);
virtual int writev(const struct iovec *, int);
virtual int inuse();
virtual int ok();
virtual ~RJS_Transport() {};
int return_on_error;
protected:
int td; // the transport file descriptor
};
class RJS_Socket : public RJS_Transport {
void abstract_class() {}
public:
enum SocketSex { Unknown,Active,Passive};
enum AddressFamily { // just work with these three for now
AfUnix = AF_UNIX,
AfInet = AF_INET,
AfDECnet = AF_DECnet
};
enum SocketType {
Stream = SOCK_STREAM,
Datagram = SOCK_DGRAM,
Raw = SOCK_RAW,
RDM = SOCK_RDM,
SeqPacket = SOCK_SEQPACKET
};
enum MsgSendFlags {
MsgSendNoFlags = 0,
MsgSendDontRoute = MSG_DONTROUTE,
MsgSendOob = MSG_OOB,
MsgSendDontRouteOob = MSG_OOB|MSG_DONTROUTE
};
enum MsgReceiveFlags {
MsgReceiveNoFlags = 0,
MsgReceivePeek = MSG_PEEK,
MsgReceiveOob = MSG_OOB,
MsgReceivePeekOob = MSG_OOB|MSG_PEEK
};
enum ShutDownType {
ShutDownReceive=0,
ShutDownSend=1,
ShutDownBoth=2
};
enum FlagOption { Off = 0, On = 1 };
enum SocketLevelOption {
Broadcast = SO_BROADCAST,
Debug = SO_DEBUG,
DontRoute = SO_DONTROUTE,
KeepAlive = SO_KEEPALIVE,
OOBInline = SO_OOBINLINE,
ReuseAddr = SO_REUSEADDR,
UseLoopBack = SO_USELOOPBACK
};
RJS_Socket( AddressFamily af,SocketType st);
~RJS_Socket();
virtual int socket();
virtual void dump();
int accept(struct sockaddr *sa, int &len);
int bind(const struct sockaddr *,int);
int connect(const struct sockaddr *,int);
int getpeername(struct sockaddr *, int &len);
int getsockname(struct sockaddr *, int &len);
int getsockopt(int, int, char *, int *); //
int listen(int);
int recv(char *, int, MsgReceiveFlags=MsgReceiveNoFlags);
int recvfrom(char *, int, struct sockaddr *,
int &,MsgReceiveFlags=MsgReceiveNoFlags);
int send(const char *, int,MsgSendFlags=MsgSendNoFlags);
int sendto(const char *, int, const struct sockaddr *,
int,MsgSendFlags=MsgSendNoFlags);
int setsockopt(int, int, const char *, int); //
int recvmsg(struct msghdr *, MsgReceiveFlags=MsgReceiveNoFlags);
int sendmsg(struct msghdr *, MsgSendFlags=MsgSendNoFlags);
virtual void shutdown(ShutDownType);
void linger();
int setsockopt(SocketLevelOption slo, FlagOption fo);
int getsockopt(SocketLevelOption slo, FlagOption &fo);
AddressFamily address_family() { return family; }
SocketType socket_type() { return type; }
SocketSex socket_sex() { return sex; }
int socket_protocol() { return protocol; }
int is_active() { return sex==Active; }
int is_passive() { return sex==Passive; }
protected:
RJS_Socket(AddressFamily af);
RJS_Socket(SocketType st);
int check_syscall(int stat,char *mess);
int syscall(int stat,char *mess);
SocketType type; // Socket Type
AddressFamily family; // Address Family
int protocol; // Protocol (currently 0)
SocketSex sex; // Active or Passive
};
class RJS_UnixSocket : public RJS_Socket {
public:
RJS_UnixSocket(SocketType st) : RJS_Socket(RJS_Socket::AfUnix,st) {}
int passive(const RJS_UnixAddress &ua);
int active(const RJS_UnixAddress &ua);
~RJS_UnixSocket();
int accept(RJS_UnixSocket &newsocket);
int close();
int getpeername(RJS_UnixAddress &ua);
int getsockname(RJS_UnixAddress &ua);
private:
const char *filename;
int unlink_socket;
};
class RJS_InetSocket : public RJS_Socket {
public:
RJS_InetSocket(SocketType st) : RJS_Socket(RJS_Socket::AfInet,st) {}
int accept(RJS_InetSocket &newsocket);
int bind(const RJS_InetAddress &ia);
int connect(const RJS_InetAddress &ia);
int getpeername(RJS_InetAddress &ia);
getsockname(RJS_InetAddress &ia);
int recvfrom(char *buffer,int maxbuf,RJS_InetAddress &is);
int sendto(char *buffer,int len,const RJS_InetAddress &is);
};
class RJS_DECnetSocket : public RJS_Socket {
public:
RJS_DECnetSocket(SocketType st) : RJS_Socket(AfDECnet,st) {};
int accept(RJS_DECnetSocket &newsocket);
int dnet_conn(const char *node, const char *obj); // use dnet_conn
int active(const RJS_DECnetAddress &da);
int passive(const RJS_DECnetAddress &da);
int dnet_eof();
};
class RJS_UnixStream : public RJS_UnixSocket {
public:
RJS_UnixStream() : RJS_UnixSocket(Stream) {}
int accept(RJS_UnixStream &newstream) {
return RJS_UnixSocket::accept(newstream);
}
};
class RJS_InetStream :public RJS_InetSocket {
public:
RJS_InetStream() : RJS_InetSocket(Stream) { }
int accept(RJS_InetStream &newstream) {
return RJS_InetSocket::accept(newstream);
}
int reserved_socket(int starting_port); // create port using rresvport
int passive(const RJS_InetAddress &ia);
int active(const RJS_InetAddress &ia);
};
class RJS_DECnetStream : public RJS_DECnetSocket {
public:
RJS_DECnetStream() : RJS_DECnetSocket(Stream) {};
int accept(RJS_DECnetStream &newstream) {
return RJS_DECnetSocket::accept(newstream);
}
};
class RJS_DECnetSeqPacket : public RJS_DECnetSocket {
public:
RJS_DECnetSeqPacket() : RJS_DECnetSocket(SeqPacket) {};
int accept(RJS_DECnetSeqPacket &newseq) {
return RJS_DECnetSocket::accept(newseq);
}
};
class RJS_InetDatagram :public RJS_InetSocket {
public:
RJS_InetDatagram() : RJS_InetSocket(Datagram) { }
int accept(RJS_InetDatagram &newsock) {
return RJS_InetSocket::accept(newsock);
}
int socket();
int active();
int passive(const RJS_InetAddress &ia);
};
// endif TRANSPORT_CLASS_H
#endif